APUE

您所在的位置:网站首页 ansi c标准中文版 APUE

APUE

2023-03-17 01:40| 来源: 网络整理| 查看: 265

APUE

在这里插入图片描述

系统调用

系统调用,我们可以理解是操作系统为用户提供的一系列操作的接口(API),这些接口提供了对系统硬件设备功能的操作。

库函数

库函数可以理解为是对系统调用的一层封装。系统调用作为内核提供给用户程序的接口,它的执行效率是比较高效而精简的,但有时我们需要对获取的信息进行更复杂的处理,或更人性化的需要,我们把这些处理过程封装成一个函数再提供给程序员,更方便于程序猿编码。

在这里插入图片描述

man手册使用 在这里插入图片描述 man printf 在这里插入图片描述 man 3 printf

在这里插入图片描述

Linux下文件I/O系统调用 一、文件和文件描述符

文件扩展名

在Linux中,扩展名对Linux内核没有实际意义,但是可以用来人为区分不同的文件,方便用户使用。

.tar,.tar.gz.tgz.zip,.tar.bz表示压缩文件,创建命令为tar,gzip,unzip等 .sh 文件表示shell脚本文件 .pl表示perl语言文件 py表示python语言文件 .conf表示系统服务的配置文件 .c 表示C文件 .h头文件 .cpp表示C++源文件 .so表示动态库文件 .a表示静态库文件

文件类型

Linux系统中把一切都看做文件,Linux有7中类型文件:普通文件-、目录(dierectory)文件、符号(link)链接、字符(character)设备文件、块(block)设备文件**(硬盘、SD卡)**、管道(pipe)文件、套接字(socket)文件。其中文件、目录、符号链接会占用磁盘空间来存储,而块设备、字符设备、套接字、管道是伪文件,并不占用磁盘空间。

文件类型标识文件类型-普通文件d目录文件l符号链接c字符设备b块设备p管道s套接字socket ls -l

在这里插入图片描述

文件描述符

文件描述符 (file descriptor, fd) 是Linux内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序在开始运行时,系统会自动打开三个文件描述符,0是标准输入,1是标准输出,2是标准错误。POSIX标准要求每次打开文件时 (含socket)必须使用当前进程中最小可用的文件描述符号码,因此第一次打开的文件描述符定是3。 在这里插入图片描述

ojh@ojh-virtual-machine:~/ch1$ vi stdout.c #include #include //STDOUT_FILENO、stdout在该头文件中声明 #include #define MSG_STR "Hello World\n" int main(int main,char *argv[]) { printf("%s",MSG_STR); fputs (MSG_STR,stdout); write(STDOUT_FILENO,MSG_STR,strlen(MSG_STR)); return 0; }

输出结果:

ojh@ojh-virtual-machine:~/ch1$ ./stdout Hello World Hello World Hello World 二、文件I/O操作

程序编写 在开始讲解文件I/0之前,我们首先运行下面这个示例程序,该程序将调用open0系统调用打开一个叫做test.txt的文件(如果不存在则会创建该文件),然后调write()系统调用将字符串 MSG_STR 写入到该文件中,之后调用read()系统调用读出该文件里的内容 ojh@ojh-virtual-machine:~/ch1$ vi file_io.c

#include #include #include #include #include #iinclude : //read write函数调用 #define BUFSIZE 1024 #define MSG_STR "hello wrold\n" int main(int argc,char **argv[]) { int fd = -1; int rv = -1; char buf[BUFSIZE]; fd=open("test.txt",O_RDWR|O_CREAT|O_TRUNC,0666); if(fd printf("Write %d bytes into file faolure: %s\n",rv,strerror(errno)); goto cleanup; } memset(buf,0,sizeof(buf)); if((rv=read(fd,buf,sizeof(buf))) char *file_name="/test.txt"; int fd=-1; fd=open(file_name,O_RDONLY,066); if(fd int fd=-1; fd=open("test.txt",O_RDWR|O_CREAT|O_TRUNC,0666); if(fd dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of ower */ gid_t st_gid; /*group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* total size,in bytes */ blksize_t st_blksize; /* blocksize for filesystem I/0 */ blkont_t st blocks; /* number of 512B blocks allocated */ time_t st atime; /*time of last access */ time_t st mtime; /*ntime of last modification */ time_t st ctime; /*time of last status change */ }; #include #include #include #include #include #include #include #include int main(int argc,char *argv[]) { struct stat stbuf; stat("stat.c",&stbuf); printf("File Mode :%o Real Size: %luB,Spece Size: %luB\n",stbuf.st_mode,stbuf.st_size,stbuf.st_blksize); return 0; }

输出结果:

ojh@ojh-virtual-machine:~/apue/ch1$ gcc stat.c -o stat ojh@ojh-virtual-machine:~/apue/ch1$ ./stat File Mode :100664 Real Size: 363B,Spece Size: 4096B ojh@ojh-virtual-machine:~/apue/ch1$ ls -l stat.c -rw-rw-r-- 1 ojh ojh 363 3月 13 22:03 stat.c

在这里插入图片描述

access()系统调用 int access(const char *path,int mode);

access()可以用来测试文件是否存在或测试其权限位,其中第一个参数path是相应的文件路径名,第二个参数是要测试的模式。其中mode说明如下:

模式说明R_OK测试读许可权W_OK测试试写许可权X_OK测试执行许可权FOK测试文件是否存在

在这里插入图片描述

unlink()系统调用

该系统调用可以用来删除文件,其本质是让文件的链接记数自减。调用该函数将path指定的文件的链接数减1,如果对该文件还有其他链接存在,则仍可以通过其他链接访问该文件的数据。只有当链接记数达到0时该文件的内容才可被删除。如果有进程打开了该文件,其内容也不能被删除。关闭一个文件时,内核首先检查打开该文件的进程个数,如果这个记数达到0,内核再去检查它的链接记数,如果记数也是0,那么就删除该文件内容。 在这里插入图片描述

可直接用unlink命令删除文件 rename()系统调用 int rename(const char *oldname, const char*newname);

该系统调用用来将文件重命名。

文件夹操作相关系统调用

在这里插入图片描述

其中readdir()系统调用的struct dirent定义如下: 在这里插入图片描述

#include #include #include #include #include #include #include #include #include #define TEST_DIR "dir" int main(int argc,char **argv[]) { int rv; int fd1; int fd2; DIR *dirp; struct dirent *direntp; /* 创建文件夹dir,并设置文件夹权限775 */ if(mkdir(TEST_DIR,0775) printf("Change directory to '%s' failure: %s\n",TEST_DIR,strerror(errno)); rv=-2; goto cleanup; } /* 在dir文件夹下 创建普通文件文本file1.txt ,并设置其权限为644 */ if((fd1=creat("file1.txt",0644)) printf("Create file2 failure: %s\n",strerror(errno)); rv=-4; goto cleanup; } /*更改当前工作路径到父目录*/ if(chdir("../") rv = -6; printf("opendir %s failure: %s\n",TEST_DIR,strerror(errno)); goto cleanup; } /*列出dir里面的所有文件和文件夹*/ while((direntp = readdir(dirp))!=NULL) { printf("Find file : %s\n",direntp->d_name); } /*关闭所有打开的文件*/ closedir(dirp); cleanup: if(fd1>=0) { close(fd1); } if(fd2>= 0) { close(fd2); } }

输出结果:

ojh@ojh-virtual-machine:~/apue/ch1$ gcc dir.c ojh@ojh-virtual-machine:~/apue/ch1$ ./a.out Find file : file1.txt Find file : .. Find file : file2.txt Find file : .


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3